1372C - Omkar and Baseball - CodeForces Solution


constructive algorithms math *1500

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>



using namespace std;



using ll = int64_t;

//using ll = long long;

using ull = uint64_t;

using i32 = int32_t;

using u32 = uint32_t;

using i64 = int64_t;

using u64 = uint64_t;

using f64 = double;

using pii = pair<int, int>;

using pll = pair<ll, ll>;

using ld = long double;



#define X first

#define Y second



#ifndef ONLINE_JUDGE

#define FWRITE

#endif



namespace io

{



#ifndef FWRITE

#include <unistd.h>

	auto unistd_read = read;

	auto unistd_write = write;

#endif

	const int BUFSIZE = 1 << 20;



	int isize, osize;

	char ibuf[BUFSIZE + 10], obuf[BUFSIZE + 10];

	char* is, * it, * os = obuf, * ot = obuf + BUFSIZE;



	char getchar()

	{

		if (is == it)

		{

			is = ibuf;

#ifdef FWRITE

			it = ibuf + fread(ibuf, 1, BUFSIZE, stdin);

#else

			it = ibuf + unistd_read(STDIN_FILENO, ibuf, BUFSIZE);

#endif

			if (is == it) return EOF;

		}

		return *is++;

	}



	char getalpha()

	{

		char c = getchar();

		while (!isalpha(c)) c = getchar();

		return c;

	}



	void putchar(char c)

	{

		*os++ = c;

		if (os == ot)

		{

#ifdef FWRITE

			fwrite(obuf, 1, BUFSIZE, stdout);

#else

			unistd_write(STDOUT_FILENO, obuf, BUFSIZE);

#endif

			os = obuf;

		}

	}



	int inp() {

		int x = 0, f = 0; char ch;

		for (ch = getchar(); !isdigit(ch); ch = getchar())

		{

			if (ch == EOF) return -1;

			if (ch == '-') f = 1;

		}

		for (; isdigit(ch); x = x * 10 + ch - '0', ch = getchar());

		return f ? -x : x;

	}



	ll inp_ll() {

		ll x = 0; int f = 0; char ch;

		for (ch = getchar(); !isdigit(ch); ch = getchar())

			if (ch == '-') f = 1;

		for (; isdigit(ch); x = x * 10 + ch - '0', ch = getchar());

		return f ? -x : x;

	}



	template<class T>

	bool read(T& x)

	{

		x = 0;

		int f = 0; char ch;

		for (ch = getchar(); !isdigit(ch); ch = getchar())

		{

			if (ch == EOF) return 0;

			if (ch == '-') f = 1;

		}

		for (; isdigit(ch); x = x * 10 + ch - '0', ch = getchar());

		if (f) x = -x;

		return 1;

	}



	bool read(char* s)

	{

		char* t = s;

		char ch = getchar();

		for (; ch == ' ' || ch == '\n'; ch = getchar());

		for (; ch != ' ' && ch != '\n' && ch != EOF; ch = getchar())

			*t++ = ch;

		*t = 0;

		return s != t;

	}



	template<class T, class... Args>

	bool read(T& x, Args&... args)

	{

		return read(x) && read(args...);

	}



	template<class T>

	bool readln(T& x)

	{

		x = 0;

		int f = 0; char ch;

		for (ch = getchar(); !isdigit(ch); ch = getchar())

		{

			if (ch == EOF) return 0;

			if (ch == '-') f = 1;

		}

		for (; isdigit(ch); x = x * 10 + ch - '0', ch = getchar());

		if (f) x = -x;

		for (; ch != '\n' && ch != EOF; ch = getchar());

		return 1;

	}



	bool readln(char* s)

	{

		char* t = s;

		while (1)

		{

			char ch = getchar();

			if (ch == '\n' || ch == EOF) break;

			*t++ = ch;

		}

		*t = 0;

		return s != t;

	}



	template<class T, class... Args>

	bool readln(T& x, Args&... args)

	{

		return read(x) && readln(args...);

	}



	template<class T>

	void write(T x)

	{

		static char s[22];

		static char* it = s + 20;

		static char* end = s + 20;



		if (x < 0)

		{

			putchar('-');

			x = -x;

		}



		do

		{

			*--it = x % 10 + '0';

			x /= 10;

		} while (x);

		/*

		if (!x)

			*-- it = '0';

		while (x)

		{

			*-- it = x%10+'0';

			x /= 10;

		}

		*/

		for (; it < end; ++it)

			putchar(*it);

	}



	void write(const char* s)

	{

		for (; *s; ++s) putchar(*s);

	}



	template<>

	void write(char* s)

	{

		write((const char*)s);

	}



	template<>

	void write(char c)

	{

		putchar(c);

	}



	template<class T, class... Args>

	void write(T x, Args... args)

	{

		write(x);

		write(args...);

	}



	void writeln()

	{

		putchar('\n');

	}



	template<class T, class... Args>

	void writeln(T x, Args... args)

	{

		write(x);

		writeln(args...);

	}



	template<class Iterator>

	bool input(Iterator st, Iterator ed)

	{

		for (; st != ed; ++st)

		{

			if (!read(*st)) return false;

		}

		return true;

	}



	template<class T>

	bool input(T& a)

	{

		return input(a.begin(), a.end());

	}



	template<class Iterator>

	void print(Iterator st, Iterator ed, const char* c = " ")

	{

		int flag = 0;

		for (; st != ed; ++st)

		{

			if (flag) write(c);

			flag = 1;

			write(*st);

		}

		writeln();

	}



	template<class T>

	void print(const T& a, const char* c = " ")

	{

		print(a.begin(), a.end(), c);

	}



	struct ender

	{

		~ender()

		{

			if (os != obuf)

#ifdef FWRITE

				fwrite(obuf, 1, os - obuf, stdout);

#else

				unistd_write(STDOUT_FILENO, obuf, os - obuf);

#endif

		}

	}__ender;



}



int64_t power(int64_t a, int64_t b, int64_t p)

{

	if (!b) return 1;

	int64_t t = power(a, b >> 1, p);

	t = t * t % p;

	if (b & 1) t = t * a % p;

	return t;

}



//mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count());

mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());

//mt19937 rd(1);



using namespace io;



template<class T>

inline void freshmin(T& a, const T& b)

{

	if (a > b) a = b;

}



template<class T>

inline void freshmax(T& a, const T& b)

{

	if (a < b) a = b;

}



//const ll B = 31;

const ll MOD = 1000000007;

const int INF = 1000000010;

const ll INFll = 4000000000000000000LL;

const int MAXN = 500010;



int dx[] = { -1, 1, 0, 0, -1, -1, 1, 1 };

int dy[] = { 0, 0, -1, 1, -1, 1, -1, 1 };



ld det(ld x1, ld y1, ld x2, ld y2, ld x3, ld y3)

{

	return x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 + x3 * y1 - x1 * y3;

}



struct node

{

	node* son[2], * pre;

	int sz;

	int val, sum;

	node();

};



node* nil = new node;



node::node()

{

	son[0] = son[1] = pre = nil;

	val = 0;

	sum = 0;

	sz = 0;

}



struct splay_tree

{



	node* root;



	splay_tree()

	{

		nil->son[0] = nil->son[1] = nil->pre = nil;

		root = nil;

	}



	void update(node* x)

	{

		x->sz = x->son[0]->sz + x->son[1]->sz + 1;

		x->sum = x->son[0]->sum + x->son[1]->sum + x->val;

	}



	void rotate(node* x, int p)

	{

		node* y = x->pre;

		if (x->son[p] != nil)

			x->son[p]->pre = y;

		y->son[p ^ 1] = x->son[p];

		x->son[p] = y;

		if (y == y->pre->son[0])

			y->pre->son[0] = x;

		else if (y == y->pre->son[1])

			y->pre->son[1] = x;

		x->pre = y->pre;

		y->pre = x;

		update(y);

		update(x);

	}



	void splay(node* x, node* p = nil)

	{

		while (x->pre != p)

		{

			node* y = x->pre;

			if (y->pre == p)

				if (x == y->son[0])

					rotate(x, 1);

				else

					rotate(x, 0);

			else

				if (y == y->pre->son[0])

					if (x == y->son[0])

					{

						rotate(y, 1);

						rotate(x, 1);

					}

					else

					{

						rotate(x, 0);

						rotate(x, 1);

					}

				else

					if (x == y->son[0])

					{

						rotate(x, 1);

						rotate(x, 0);

					}

					else

					{

						rotate(y, 0);

						rotate(x, 0);

					}

		}

		if (p == nil) root = x;

	}



	node* insert(int v)

	{

		if (root == nil)

		{

			root = new node;

			root->val = v;

			return root;

		}

		node* x = root;

		while (1)

		{

			if (x->val > v)

			{

				if (x->son[0] == nil)

				{

					x->son[0] = new node;

					x->son[0]->pre = x;

					x = x->son[0];

					x->val = v;

					break;

				}

				x = x->son[0];

			}

			else

			{

				if (x->son[1] == nil)

				{

					x->son[1] = new node;

					x->son[1]->pre = x;

					x = x->son[1];

					x->val = v;

					break;

				}

				x = x->son[1];

			}

		}

		splay(x);

		return x;

	}



	node* last_node(node* x)

	{

		node* p = x->son[0];

		while (p->son[1] != nil) p = p->son[1];

		return p;

	}



	node* next_node(node* x)

	{

		node* p = x->son[1];

		while (p->son[0] != nil) p = p->son[0];

		return p;

	}



	void erase(node* x)

	{

		splay(x);

		node* L = last_node(x);

		node* R = next_node(x);

		if (L == nil && R == nil)

		{

			root = nil;

		}

		else if (L == nil)

		{

			splay(R);

			R->son[0] = nil;

			update(R);

		}

		else if (R == nil)

		{

			splay(L);

			L->son[1] = nil;

			update(L);

		}

		else

		{

			splay(L);

			splay(R, L);

			R->son[0] = nil;

			update(R);

			update(L);

		}

	}



	node* get_last(node* x)

	{

		splay(x);

		node* p = last_node(x);

		if (p != nil) splay(p);

		return p;

	}



	node* get_next(node* x)

	{

		splay(x);

		node* p = next_node(x);

		if (p != nil) splay(p);

		return p;

	}



	int size() const

	{

		return root->sz;

	}

	void splay_kth(int k)

	{

		node* x = root;

		while (1)

		{

			if (x->son[0]->sz + 1 == k) break;

			if (x->son[0]->sz >= k)

				x = x->son[0];

			else

			{

				k -= x->son[0]->sz + 1;

				x = x->son[1];

			}

		}

		splay(x);

	}

	int prefix_sum(int k)

	{

		if (k == 0) return 0;

		splay_kth(k);

		return root->son[0]->sum + root->val;

	}

};



void solve()

{

	int n;

	read(n);

	vector<int> a(n);

	input(a);

	for (auto& x : a) x -= 1;



	vector<int> b(n);

	int sum = 0;

	for (int i = 0; i < n; ++i)

	{

		sum += b[i] = a[i] == i;

	}



	if (sum == n)

	{

		return writeln(0);

	}



	int L = 0, R = n - 1;

	while (b[L] == 1) ++L;

	while (b[R] == 1) --R;

	int flag = 0;

	for (int i = L + 1; i <= R - 1; ++i) if (b[i] == 1) flag = 1;

	if (flag == 0)

		return writeln(1);

	else

		return writeln(2);

}



int main()

{



	int T = 1;

	read(T);

	for (int test = 1; test <= T; ++test)

	{

		//write("Case #", test, ": ");

		solve();

	}



	return 0;

}


Comments

Submit
0 Comments
More Questions

811A - Vladik and Courtesy
1006B - Polycarp's Practice
1422A - Fence
21D - Traveling Graph
1559B - Mocha and Red and Blue
1579C - Ticks
268B - Buttons
898A - Rounding
1372B - Omkar and Last Class of Math
1025D - Recovering BST
439A - Devu the Singer and Churu the Joker
1323A - Even Subset Sum Problem
1095A - Repeating Cipher
630F - Selection of Personnel
630K - Indivisibility
20B - Equation
600B - Queries about less or equal elements
1015A - Points in Segments
1593B - Make it Divisible by 25
680C - Bear and Prime 100
1300A - Non-zero
1475E - Advertising Agency
1345B - Card Constructions
1077B - Disturbed People
653A - Bear and Three Balls
794A - Bank Robbery
157A - Game Outcome
3B - Lorry
1392A - Omkar and Password
489A - SwapSort